package com.ruoyi.weixin.juc2;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @Description: TODO
 * @Author ONESTAR
 * @Date: 2021/12/24 10:54
 * @Version 1.0
 */

// 真正的多线程开发，在公司中的开发
// 线程就是一个单独的资源类，没有任何附属的操作
// 1、属性、方法
public class SaleTicketDemo02 {
    public static void main(String[] args) {
        // 并发：多线程操作同一资源类，把资源类丢入线程
        Ticket2 ticket2 = new Ticket2();

        // @FunctionalInterface 函数式接口,
        // jdk1.8之后，lambda表达式 ()->{} 可以简化代码
//        new Thread(new Runnable(){
//            @Override
//            public void run() {
//
//            }
//        }).start();

        new Thread(() -> {
            for (int i = 1; i<60; i++){
                ticket2.sale();
            }
        }, "A").start();

        new Thread(() -> {
            for (int i = 1; i<60; i++){
                ticket2.sale();
            }
        }, "B").start();

        new Thread(() -> {
            for (int i = 1; i<60; i++){
                ticket2.sale();
            }
        }, "C").start();

    }
}

// 资源类 OOP
// 使用Lock
class Ticket2 {
    // 属性方法
    private int number = 50;

    Lock lock = new ReentrantLock();

    // synchronized本质队列 锁
    public synchronized void sale() {
        if (number > 0) {
            System.out.println(Thread.currentThread().getName() + "卖出了" + (number--) + "张票，剩余" + number);
        }
    }
}